import { resolve } from 'node:path' // Node.js 工具函数，用于路径处理
import { fileURLToPath, URL } from 'node:url'
import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite' // Vue I18n 插件
import Vue from '@vitejs/plugin-vue' // Vite 官方 Vue 插件，支持 Vue 3 单文件组件
/// <reference types="vitest" />
// Plugins
import AutoImport from 'unplugin-auto-import/vite' // 自动导入常用 API，减少手动 import
import Components from 'unplugin-vue-components/vite' // 自动注册 Vue 组件
import { VueRouterAutoImports } from 'unplugin-vue-router' // Vue Router 的自动导入 API
// Utilities
import { defineConfig } from 'vite' // Vite 提供的配置类型定义函数
import electronPlugin from 'vite-plugin-electron'

import vueDevTools from 'vite-plugin-vue-devtools'
import Layouts from 'vite-plugin-vue-layouts-next' // 支持 Vue 布局组件
import Vuetify, { transformAssetUrls } from 'vite-plugin-vuetify' // Vuetify UI 框架集成插件

import { cleanReleasePlugin } from './vite/cleanReleasePlugin'
import {
  createElectronConfig,
  createSentryPlugin,
  createSharedDefineConfig,
  loadEnvironmentVariables,
  logBuildInfo
} from './vite/configUtils'
import { getRollupInput } from './vite/getRollupInput'
import reloadElectronApp from './vite/reloadElectronApp'
import { createViteConfigWatcherPlugin } from './vite/viteConfigWatcherPlugin'
import { vitestConfig } from './vite/vitestConfig'

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  // 加载环境变量
  const env = loadEnvironmentVariables(mode)
  const isVitest = process.env.VITEST === 'true' || mode === 'test'
  const isE2E = process.env.E2E === 'true'
  // 输出构建信息
  logBuildInfo(mode)
  return {
    base: './', // 添加基础路径配置
    plugins: [
      cleanReleasePlugin(), // 在构建前清空 release 目录
      Vue({
        template: { transformAssetUrls } // 处理 Vue 模板中的资源 URL 转换
      }),
      vueDevTools({ componentInspector: false }),
      // https://github.com/vuetifyjs/vuetify-loader/tree/master/packages/vite-plugin#readme
      Vuetify({
        autoImport: true, // 自动导入 Vuetify 组件和指令
        // styles: 'sass'
        styles: {
          configFile: 'srcRenderer/styles/settings.scss' // 自定义 SCSS 变量配置文件
        }
      }),
      // Vite 配置文件监听插件 - 监听 vite 目录和配置文件变化
      !isVitest && !isE2E && createViteConfigWatcherPlugin(() => reloadElectronApp(true)),
      !isVitest &&
        !isE2E &&
        electronPlugin([
          // 主进程配置（使用 ESM）
          createElectronConfig('srcMain/main.ts', 'dist', 'esm', mode, env, () =>
            reloadElectronApp()
          ),
          // 预加载脚本配置（使用 CJS，确保 require 可用）
          createElectronConfig(
            'srcPreloads/externalWeb.ts',
            'dist/preloads',
            'cjs',
            mode,
            env,
            () => reloadElectronApp()
          ),
          // 预加载脚本配置（使用 CJS，确保 require 可用）
          createElectronConfig(
            'srcPreloads/internalWeb.ts',
            'dist/preloads',
            'cjs',
            mode,
            env,
            () => reloadElectronApp()
          )
        ]),

      VueI18nPlugin({
        include: [resolve(__dirname, './auto/locales/**')],
        strictMessage: false
      }),
      Layouts(), // 启用布局组件功能
      AutoImport({
        imports: [
          'vue', // 自动导入 Vue 核心 API 不用再写 import {ref} from 'vue'
          ...(isVitest ? (['vitest'] as const) : []), // 仅在 Vitest 环境自动导入 Vitest API，避免运行时引入
          VueRouterAutoImports, // 自动导入 Vue Router 相关 API
          {
            pinia: ['defineStore', 'storeToRefs'] // 自动导入 Pinia 状态管理 API
          }
        ],
        dts: 'auto/auto-imports.d.ts', // 生成自动导入的类型声明文件
        eslintrc: {
          enabled: true, // 启用 ESLint 配置支持
          // filepath: 'auto/.eslintrc-auto-import.json', // 指定生成的文件路径
          globalsPropValue: true // 配置全局变量的值
        },
        vueTemplate: true // 在 Vue 模板中启用自动导入
      }),
      Components({
        dirs: ['srcRenderer/components'],
        dts: 'auto/components.d.ts' // 生成组件自动注册的类型声明文件
      }),

      // Sentry 插件配置 - 仅在有 Auth Token 时启用
      !isVitest && !isE2E && createSentryPlugin('dist', mode)
    ].filter(Boolean),
    optimizeDeps: {
      exclude: [
        'vuetify', // 排除 Vuetify，避免优化依赖打包
        'vue-router', // 排除 Vue Router
        'unplugin-vue-router/runtime', // 排除 unplugin-vue-router 运行时模块
        'unplugin-vue-router/data-loaders',
        'unplugin-vue-router/data-loaders/basic'
      ]
    },
    // 定义全局常量，在构建时替换
    define: createSharedDefineConfig(env, mode),
    resolve: {
      alias: {
        '#': fileURLToPath(new URL('srcMain', import.meta.url)), // 设置路径别名 # 指向 srcMain 目录
        '@': fileURLToPath(new URL('srcRenderer', import.meta.url)), // 设置路径别名 @ 指向 srcRenderer 目录
        '~types': fileURLToPath(new URL('srcShared/types', import.meta.url)),
        '~shared': fileURLToPath(new URL('srcShared', import.meta.url)),
        // 本地目录别名，支持子路径解析
        'global-state': fileURLToPath(new URL('library/global-state/renderer', import.meta.url))
      },
      extensions: [
        '.js',
        '.json',
        '.jsx',
        '.mjs',
        '.ts',
        '.tsx',
        '.vue' // 支持的文件扩展名
      ]
    },
    server: {
      port: 4173, // 开发服务器端口
      sourcemapIgnoreList: false // 开发环境启用 sourcemap
    },
    build: {
      emptyOutDir: true,
      sourcemap: true, // 生产环境生成 source maps
      chunkSizeWarningLimit: 1000, // 提高警告阈值到 1000KB
      rollupOptions: {
        input: getRollupInput(),
        output: {
          // 手动配置代码分割
          manualChunks: {
            // Vue 核心库
            'vue-vendor': ['vue', 'vue-router', 'pinia'],
            // Vuetify UI 框架
            'vuetify-vendor': ['vuetify'],
            // 国际化
            'i18n-vendor': ['vue-i18n'],
            // 工具库
            'utils-vendor': ['lodash', 'axios'],
            // 数据库
            'db-vendor': ['dexie'],
            // 图表库（如果使用）
            'graph-vendor': ['relation-graph-vue3']
          },
          // 优化资源文件命名
          chunkFileNames: 'assets/js/[name]-[hash].js',
          entryFileNames: 'assets/js/[name]-[hash].js',
          assetFileNames: 'assets/[ext]/[name]-[hash].[ext]'
        }
      }
    },
    // 开发环境也启用 sourcemap
    esbuild: {
      sourcemap: mode === 'development'
    },
    // Vitest 测试配置
    test: vitestConfig
  }
})
